home *** CD-ROM | disk | FTP | other *** search
- #define DEBUG 0
- /*
- TOWNS囲碁棋譜記録プログラム
- 1991/12/11 久保田俊也
-
- 93/05/24 印刷 モジュールを本体より分離
-
-
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <egb.h>
- #include <conio.h>
- #include <msdos.cf>
- #include <BPRDEV.H>
- #include "igo.h"
- #include "banx.h"
- #include "kiffile.h"
- #include "title.h"
-
- #define WHITE_PRINT_COL 0
- #define BLACK_PRINT_COL 1
- #define WAKUX1 0
- #define WAKUY1 0
- #define ISHI_R 16
-
- extern char *gwork; /* グラフイックBIOSワーク */
- extern char para[64] ;
-
- static BPR_Info info;
- static BPR_Buff buff;
- static BPR_Work work;
- static char work1[BPR_BUFFSIZE];
-
- static int banx1, bany1, banx2, bany2, ishi_r, ishi_2r;
- static int ban_length = 640, tate_bangai = 200;
- static int left_mergin = 0;
- static int type, bansize;
- static char *ram;
-
- void *my_malloc(size_t size);
-
- int print_start()
- {
- int rc;
-
- ram = my_malloc( 640*840/8 );
- EGB_resolutionRam( gwork, 0x80, 1, 640, 840, ram) ; /* 仮想画面の設定 */
- EGB_writePage( gwork, 0x80) ; /* 仮想画面に書き込み */
-
- info.BitType = BPR_MONO;
- info.Density = 90; /* 印刷画像の大きさの設定 */
- info.Width = ban_length + left_mergin;
- info.Height = ban_length + tate_bangai;
- info.Palette = NULL;
- info.ColorType = BPR_MONO;
- info.Reverse = BPR_NORMAL;
- info.TopSpace = 0;
- info.LeftSpace = 0;
- info.rsv[0] = info.rsv[1] = info.rsv[2] = info.rsv[3] = 0;
-
- buff.BuffSize = BPR_BUFFSIZE;
- buff.BuffAddr = work1;
-
- rc = BPR_Select( 0,&info,&buff );
- if( rc < 0 )
- {
- printf("--BPR_Select ERROR!! %x--\n",BPRDEVERR);
- my_free(ram);
- EGB_writePage( gwork, 0) ; /* ページ 0 に */
- return -1;
- }
-
- rc = BPR_GetSize( &work );
- if( rc < 0 )
- {
- printf("--BPR_GetSize ERROR!! %x--\n",BPRDEVERR);
- my_free(ram);
- EGB_writePage( gwork, 0) ; /* ページ 0 に */
- return -1;
- }
-
- if( work.Work1.BuffSize != 0 )
- work.Work1.BuffAddr = my_malloc( work.Work1.BuffSize );
- work.Work2.BuffAddr = my_malloc( work.Work2.BuffSize );
- work.Work3.BuffAddr = my_malloc( work.Work3.BuffSize );
- work.Work4.BuffAddr = my_malloc( work.Work4.BuffSize );
- work.Work5.BuffAddr = my_malloc( work.Work5.BuffSize );
-
- rc = BPR_Start( 0, 40, &work );
- if( rc < 0 )
- {
- printf("--BPR_Start ERROR!! %x--\n",BPRDEVERR);
- my_free(ram);
- if( work.Work1.BuffSize != 0 )
- my_free(work.Work1.BuffAddr);
- my_free(work.Work2.BuffAddr);
- my_free(work.Work3.BuffAddr);
- my_free(work.Work4.BuffAddr);
- my_free(work.Work5.BuffAddr);
-
- EGB_writePage( gwork, 0) ; /* ページ 0 に */
- return -1;
- }
-
- EGB_writePage( gwork, 0) ; /* ページ 0 に */
- return 0;
- }
-
- int print_bangai( char *wstr, int start_te, int end_te)
- {
-
- EGB_writePage( gwork, 0x80 ) ; /* 仮想画面に設定 */
-
- print_do_bangai();
- print_do_title( start_te, end_te);
- print_do_kakusite( wstr);
-
- EGB_writePage( gwork, 0 ) ; /* ページ 0 に */
-
- return 0;
- }
-
- static int print_do_bangai()
- {
-
- EGB_color( gwork, 0, 1 /* BLACK_COL */) ;
- EGB_color( gwork, 2, 0 /* WHITE_COL */) ;
- EGB_paintMode( gwork, 0x022 );
- EGB_box( gwork, WAKUX1+left_mergin,
- WAKUY1, WAKUX1+left_mergin+ban_length-1,
- WAKUY1+tate_bangai); /* [46] 四角を描く */
-
- return 0;
- }
-
- static int print_do_title( int start_te, int end_te)
- {
- char disp_line[80];
- char blackname[21], whitename[21];
- char wstr[33], wstr2[33];
- char play_space[21];
- int komi_id, komi_number, hanmoku_id;
- int vicdef_id, vicdef_number;
- char start_time[80], end_time[80];
-
- static char komi_str[3][11] = {
- {"黒コミ出し"},
- {"白コミ出し"},
- {"コミなし "},
- };
-
- static char vicdef_str[4][5] = {
- {"黒 "},
- {"白 "},
- {"ジゴ"},
- {" "},
- };
-
- /* 1行目 */
- Debugprint("igo:print_do_title first line!\n");
- hyouji_start_end_time( start_time, end_time);
- sprintf(disp_line, "対局日時 %s ー %s", start_time, end_time);
- print_gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 1*16);
-
- /* 2行目 */
- Debugprint("igo:print_do_title second line!\n");
- title_blacknameread( blackname);
- title_whitenameread( whitename);
- sprintf(disp_line, "対局者 黒 %s ー 白 %s", blackname, whitename);
- print_gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 2*16);
-
- /* 3行目 */
- Debugprint("igo:print_do_title third line!\n");
- title_playspaceread( play_space);
- sprintf(disp_line, "対局場所 %s", play_space);
- print_gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 3*16);
-
- /* 4行目 */
- Debugprint("igo:print_do_title fourth line!\n");
- if(title_handy_int_read() == 1){
- strcpy(wstr, "互先");
- }else{
- sprintf(wstr, "%s子局", title_handy_wazenkaku_read());
- }
- title_komiread( &komi_id, &komi_number, &hanmoku_id);
- sprintf(wstr2, "");
- if(komi_id!=2 && komi_number > 0){
- switch(hanmoku_id ){
- case 0:
- sprintf(wstr2, "%d目半", komi_number);
- break;
- case 1:
- default:
- sprintf(wstr2, "%d目 ", komi_number);
- break;
- }
- }
- sprintf(disp_line, "手合い %s %s%s",
- wstr, komi_str[komi_id], wstr2);
- print_gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 4*16);
-
- /* 5行目 */
- Debugprint("igo:print_do_title five line!\n");
- title_issueread( &vicdef_id, &vicdef_number);
- switch(vicdef_id ){
- case 0:
- case 1:
- if(vicdef_number==-1){
- strcpy(wstr, "中押し勝ち");
- }else if(vicdef_number==0){
- if(hanmoku_id == 0 && (komi_id == 0 || komi_id == 1)){
- strcpy(wstr, "半目勝ち");
- }else{
- strcpy(wstr, "中押し勝ち");
- }
- }else{
- if(hanmoku_id == 0 && (komi_id == 0 || komi_id == 1)){
- sprintf(wstr, "%d目%s", vicdef_number, "半勝ち");
- }else if(vicdef_id != 2){
- sprintf(wstr, "%d目%s", vicdef_number, "勝ち");
- }
- }
- break;
- default: break;
- }
- sprintf(disp_line, "結果 %s%s", vicdef_str[vicdef_id], wstr);
- print_gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 5*16);
-
- /* 6行目 */
- Debugprint("igo:print_do_title sixth line!\n");
- sprintf(disp_line, "%d手から%d手まで表示", start_te, end_te);
- print_gprint( disp_line, WAKUX1+left_mergin+5 , WAKUY1+5 + 6*16);
-
- return 0;
- }
-
- static int print_do_kakusite( char *wstr)
- {
- char disp_line[80]; /* 80 は1行分の長さ */
- int i,j,k;
- int max_line;
-
- max_line = ((tate_bangai - 5)/16)-6;
- k=0;
- j=0;
- for(i=0;wstr[i]!='\0';i++){
- /* 行数のオーバーのチェック */
- if(k==max_line-1){
- strcpy( disp_line, "以下略");
- print_gprint( disp_line, WAKUX1+left_mergin+5, WAKUY1+5 + (7+k)*16);
- break;
- }
-
- disp_line[j] = wstr[i];
- j++;
- if((wstr[i] == ')' && j>60 ) || j>79 ){
- disp_line[j] = '\0';
- /* 7行目 から印刷 */
- print_gprint( disp_line, WAKUX1+left_mergin+5, WAKUY1+5 + (7+k)*16);
- k++;
- j=0;
- disp_line[0] = '\0';
- i++;
- for(;wstr[i]==' ';i++){
- ;
- }
- i--;
- }
- }
-
- disp_line[j] = '\0';
- print_gprint( disp_line, WAKUX1+left_mergin+5, WAKUY1+5 + (7+k)*16);
-
- return 0;
- }
-
- int print_te( char ban[],int ex_ban[])
- {
- BAN_TYPE ban_type;
-
- ban_type = *title_bantype_read();
- if( ban_type.type == NORMAL){
- type = NORMAL;
- bansize = ban_type.size;
- }
-
- EGB_writePage( gwork, 0x80 ) ; /* 仮想画面に設定 */
-
- EGB_color( gwork, 0, 1 /* BLACK_COL */ ) ;
- EGB_color( gwork, 2, 0 /* WHITE_COL */ ) ;
- EGB_paintMode( gwork, 0x022 );
- EGB_box( gwork, WAKUX1+left_mergin,
- WAKUY1+tate_bangai, WAKUX1+left_mergin+ban_length-1,
- WAKUY1+tate_bangai+ban_length-1); /* [46] 四角を描く */
-
- print_goban( WAKUX1+left_mergin, WAKUY1+tate_bangai, ISHI_R);
- print_do_te( ban, ex_ban);
-
- EGB_writePage( gwork, 0 ) ; /* ページ 0 に */
-
- return 0;
- }
-
- static int print_goban(int x, int y, int z)
- {
- int i, j ;
-
- banx1 = x;
- bany1 = y;
- ishi_r = z;
- ishi_2r = ishi_r * 2;
- banx2 = banx1 + (bansize+1)*ishi_2r-1;
- bany2 = bany1 + (bansize+1)*ishi_2r-1;
-
- EGB_color( gwork, 0, BLACK_PRINT_COL) ;
- EGB_color( gwork, 2, BLACK_PRINT_COL) ;
- for ( i = 0; i < bansize; i++){
- EGB_singleLine( gwork, (i+1)*ishi_2r+banx1, bany1+ishi_2r,
- (i+1)*ishi_2r+banx1, bany2-ishi_2r) ;
- EGB_singleLine( gwork, banx1+ishi_2r, bany1+(i+1)*ishi_2r,
- banx2-ishi_2r, bany1+(i+1)*ishi_2r) ;
- }
-
- if( type==NORMAL && bansize == 19){
- for ( i = 0; i < 3; i++){
- for ( j = 0; j < 3; j++){
- WORD(para + 0) = 6*ishi_2r*i+banx1+4*ishi_2r;
- WORD(para + 2) = 6*ishi_2r*j+bany1+4*ishi_2r;
- WORD(para + 4) = 2;
- EGB_circle( gwork, para ) ; /* その位置に点を描く */
- }
- }
- }
-
- return 0;
- }
-
- static int print_do_te(char ban[],int ex_ban[])
- {
- char s[4];
- int stonex, stoney;
- int ichi;
-
- for(stoney=1;stoney<(bansize+1);stoney++){
- for(stonex=1;stonex<(bansize+1);stonex++){
- ichi = henkan_disp_out( stonex, stoney);
- switch(ban[ichi]){
- case BLACK:
- EGB_color( gwork, 0, BLACK_PRINT_COL);
- EGB_color( gwork, 2, BLACK_PRINT_COL);
- print_gcircle((stonex)*ishi_2r+banx1, (stoney)*ishi_2r+bany1,
- ishi_r);
- break;
- case WHITE:
- EGB_color( gwork, 0, BLACK_PRINT_COL) ;
- EGB_color( gwork, 2, WHITE_PRINT_COL);
- print_gcircle((stonex)*ishi_2r+banx1, (stoney)*ishi_2r+bany1,
- ishi_r);
- break;
- case BLANK:
- break;
- }
-
- switch(ban[ichi]){
- case BLANK:
- break;
- case BLACK:
- EGB_color( gwork, 0, WHITE_PRINT_COL) ;
- EGB_color( gwork, 2, WHITE_PRINT_COL) ;
- break;
- case WHITE:
- EGB_color( gwork, 0, BLACK_PRINT_COL) ;
- EGB_color( gwork, 2, BLACK_PRINT_COL) ;
- break;
- }
- if(ban[ichi] != BLANK){
- if(ex_ban[ichi] >= 100){
- s[0] = '0' + ex_ban[ichi]/100;
- s[1] = '0' + (ex_ban[ichi]%100)/10;
- s[2] = '0' + (ex_ban[ichi]%10);
- s[3] = '\0';
- print_gprint(s, (stonex)*ishi_2r+banx1-12,
- (stoney)*ishi_2r+bany1+8);
- }else if(ex_ban[ichi] >= 10){
- s[0] = '0' + ex_ban[ichi]/10;
- s[1] = '0' + (ex_ban[ichi]%10);
- s[2] = '\0';
- print_gprint(s, (stonex)*ishi_2r+banx1-8,
- (stoney)*ishi_2r+bany1+8);
- }else if(ex_ban[ichi] >= 1){
- s[0] = '0' + (ex_ban[ichi]%10);
- s[1] = '\0';
- print_gprint(s, (stonex)*ishi_2r+banx1-4,
- (stoney)*ishi_2r+bany1+8);
- }
-
- }
- }
- }
-
-
- return 0;
- }
-
- int print_exec()
- {
-
- char g_buf[640*40/8];
- int i, ystep;
- int rc;
-
- EGB_writePage( gwork, 0x80 ) ; /* 仮想画面に設定 */
-
- ystep = 40;
- for(i=0;i<ban_length+tate_bangai;i+=ystep){
- DWORD(para) = (int)g_buf;
- WORD(para+4) = getds();
- WORD(para+6) = left_mergin;
- WORD(para+8) = i;
- WORD(para+10) = ban_length+left_mergin-1;
- WORD(para+12) = i+ystep-1;
- EGB_getBlock(gwork, para);
-
- rc = BPR_Print( ystep, g_buf);
- if( rc < 0 ){
- printf("--BPR_Print ERROR!! %x--\n",BPRDEVERR);
- my_free(ram);
- if( work.Work1.BuffSize != 0 )
- my_free(work.Work1.BuffAddr);
- my_free(work.Work2.BuffAddr);
- my_free(work.Work3.BuffAddr);
- my_free(work.Work4.BuffAddr);
- my_free(work.Work5.BuffAddr);
- EGB_writePage( gwork, 0) ; /* ページ 0 に */
- return -1;
- }
- }
-
- my_free(ram);
- if( work.Work1.BuffSize != 0 )
- my_free(work.Work1.BuffAddr);
- my_free(work.Work2.BuffAddr);
- my_free(work.Work3.BuffAddr);
- my_free(work.Work4.BuffAddr);
- my_free(work.Work5.BuffAddr);
-
- EGB_writePage( gwork, 0) ; /* ページ 0 に */
-
- return 0;
-
- }
-
- /* p 文字列 x 初期座標 y 初期座標 */
- static int print_gprint( char *p, int x, int y)
- {
- int i;
- char dsp[80];
-
- WORD(dsp+0) = x;
- WORD(dsp+2) = y;
- for(i=0;i<80;i++){
- dsp[i+6] = (char)(BYTE(p+i));
- if(dsp[i+6] == (char)0 ){
- break;
- }
- }
- WORD(dsp+4) = i;
- EGB_writeMode(gwork, 0);
- EGB_sjisString(gwork, dsp);
- return i;
-
- }
-
- static int print_gcircle(int x, int y, int r)
- {
-
- WORD(para + 0) = x;
- WORD(para + 2) = y;
- WORD(para + 4) = r;
- EGB_circle( gwork, para ) ;/* その位置に点を描く */
-
- return 0;
-
- }
-